import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserStore } from '@/stores/user'
import { usePermissionStore } from '@/stores/permission'
import { loginRoute, notFoundRoute } from './constants'

// 配置 NProgress
NProgress.configure({
  showSpinner: false
})

// 引入拆分出去的路由模块配置文件
// import dashboardRoutes from './modules/dashboard'
// import systemRoutes from './modules/system'

// === BEGIN 自动导入 modules 下子配置 ===
// 使用 import.meta.glob() 导入 ./modules 下所有的 .ts 文件
const modules = import.meta.glob('./modules/*.ts', {
  eager: true, // 启用同步
  import: 'default' // 得到modules中value直接是模块中默认导出的内容
})
// 模块路由配置
const modList: RouteRecordRaw[] = []
// 遍历 modules
Object.keys(modules).forEach((key: string) => {
  // as any[] 类型断言
  const mod = modules[key] as any[]
  // mod 对应文件中返回的 数组对象
  // 将 mod 的内容，写入到 modList 中
  modList.push(...mod)
})
// === END 自动导入 modules 下子配置 ===

export const asyncRoutes = modList

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  // routes: [loginRoute, ...asyncRoutes]
  routes: [loginRoute] // 只挂载常量路由
})

const whiteList = ['login', 'not-found']
// 全局前置守卫
/**
 * next 在 4.x 之前是必须的，4.x 时不必须了
 *  1. next(false)                return false
 *  2. next('/login')             return '/login'
 *  3. next({ name: 'login' })    return {name: 'login'}
 *  4. next() || next(true)       return true | return undefined | 不写 return
 */
router.beforeEach(async (to, from) => {
  const userStore = useUserStore()
  const permissionStore = usePermissionStore()
  const token = userStore.token // token
  const permissions = userStore.permissions

  NProgress.start()

  if (!whiteList.includes(to.name as string)) {
    // 不是白名单
    if (!token) {
      // 没有token，去登录
      return '/login'
    }

    // 1. 路由守卫判断权限
    // if (!permissions.includes(to.name as string)) {
    //   // 没有权限， 去登录
    //   return '/login'
    // }

    // 2. 权限相关的，放在这儿调用
    //    2.0 判断 permissionStore.isAddedRoute
    if (permissionStore.isAddedRoute) {
      return
    }
    //    2.1 获取用户信息
    const userInfo = await userStore.getInfo()
    //    2.2 根据用户信息构建生成有权限的路由数据
    const permissionRoutes = await permissionStore.generateRoutes(userInfo)
    //    2.3 循环动态添加路由
    permissionRoutes.forEach((route) => {
      router.addRoute(route)
    })
    //    2.3 补丁，404页面，需要动态添加且放在最后
    router.addRoute(notFoundRoute)
    //    2.4 修改 permissionStore.isAddedRoute 这个数据
    permissionStore.isAddedRoute = true
    //    2.4 添加完成之后，需要重定向到 to
    return to.path
  }
})

router.afterEach(() => {
  NProgress.done()
})

export default router
